package net.ermannofranco.xmltest;

/*
 * EmailSchema.java
 *
 * Created on 28 marzo 2004, 20.02
 */
import net.ermannofranco.xml.schema.ComplexType;
import net.ermannofranco.xml.schema.Facet;
import net.ermannofranco.xml.schema.RestrictionSimpleType;
import net.ermannofranco.xml.schema.Schema;
import net.ermannofranco.xml.schema.Sequence;
import net.ermannofranco.xml.schema.SimpleType;
import net.ermannofranco.xml.schema.Use;
import net.ermannofranco.xml.schema.XmlType;

public class EmailSchema extends Schema {

	public EmailSchema() throws Exception {

		RestrictionSimpleType re;
		Sequence seq;

		setTargetNamespace("ema", "email.xsd");// metodo di
		// Schema
		// .setElemFormDefQualified(true);// ogni metodo restituisce un
		// riferimento
		// all'oggetto corrente, cosi' si possono incatenare

		// referenzio una restrizione, il riferimento a SimpleType non mi serve
		re = addSimpleType("language")// addSimpleType richiede un nome al
				// primo livello; incateno e vado
				// avanti
				.setRestriction(XmlType.STRING)// metodo di SimpleType,
		// restituisce un ogg.
		// Restriction
		;
		// metodo di Restriction che accetta interi, valori stringa
		// la classe Facet fornisce tutte le costanti dei Facet
		re.addFacet(Facet.ENUMERATION, "Western");// enumeration e pattern
		re.addFacet(Facet.ENUMERATION, "Greek");// possono essere reiterati
		re.addFacet(Facet.ENUMERATION, "Latin");// gli altri facet no
		re.addFacet(Facet.ENUMERATION, "Universal");
		// a questo punto l'oggetto e completo, non si deve chiudere nulla,
		// ne' tantomeno si aggiunge a qualcos'altro, e' tutto gia' fatto

		SimpleType priority = addSimpleType("priority");
		re = priority.setRestriction(XmlType.STRING);
		re.addFacet(Facet.ENUMERATION, "NORMAL");
		re.addFacet(Facet.ENUMERATION, "LOW");
		re.addFacet(Facet.ENUMERATION, "HIGH");

		ComplexType bcc = addComplexType("bcc");
				bcc.setMixed()
				.addDocumentation(
						"setMixed nel manuale e' inutile, perche' il contenuto e' semplice, viene disattivata l'istruzione");
		bcc.setSimpleContent()// questo nel manuale e' sbagliato, extension non
				// puo' essere direttamente aggiunta a
				// ComplexType
				// va prima istanziato un contenuto, in questo caso
				// simpleContent
				.setExtension(priority).addTagAttribute("hidden",
						XmlType.BOOLEAN)// qui mi sembra sbagliato il manuale;
				// il tipo dovrebbe essere
				// xsd:boolean
				.setUse(Use.REQUIRED)
		// .setDefault("true")//questo nel manuale e' sbagliato, required e
		// default sono
		// mutuamente esclusivi. Logico, no?
		;

		// riciclo ref a ComplexType
		// mi serve un ref a Sequence
		// nome obbligato al primo livello
		ComplexType anonCt = addElem("email").setComplexType();

		seq = anonCt.setSequence();
		seq.addElem("to", XmlType.STRING).setAllPossibleOccurs();
		seq.addElem("from", XmlType.STRING).setMinOccurs(1).setMaxOccurs(1);
		seq.addElem("cc", XmlType.STRING).setAllPossibleOccurs();
		seq.addElem("bcc", XmlType.STRING).setAllPossibleOccurs();
		seq.addElem("subject", XmlType.STRING).setZeroOrOneOccurs();
		seq.addElem("body", XmlType.STRING).setZeroOrOneOccurs();

		// manuale palesemente errato:
		// non si puo' annidare attribute nella sequence
		// va aggiunto a ComplexType direttamente, ma DOPO i contenuti
		anonCt.addTagAttribute("langage", "language");
		anonCt.addTagAttribute("encrypted", XmlType.STRING);
		anonCt.addTagAttribute("prioity", "priority").setDefault("NORMAL");
		// prove varie
		// <xs:simpleType name="mountainbikesize">
		// <xs:restriction base="xs:string">
		// <xs:enumeration value="small"/>
		// <xs:enumeration value="medium"/>
		// <xs:enumeration value="large"/>
		// </xs:restriction>
		// </xs:simpleType>
		//
		// <xs:complexType name="FamilyMountainBikeSizes">
		// <xs:simpleContent>
		// <xs:extension base="mountainbikesize">
		// <xs:attribute name="familyMember" type="xs:string" />
		// </xs:extension>
		// </xs:simpleContent>
		// </xs:complexType>
		//
		// <xs:complexType name="ChildMountainBikeSizes>
		// <xs:simpleContent>
		// <xs:restriction base="FamilyMountainBikeSizes" >
		// <xs:enumeration value="small"/>
		// <xs:enumeration value="medium"/>
		// </xs:restriction>
		// </xs:simpleContent>
		// </xs:complexType>

		SimpleType mountainbikesize = addSimpleType("mountainbikesize");
		mountainbikesize.setRestriction(XmlType.STRING).addEnumerationFacet(
				"small", "medium", "medium");
		ComplexType FamilyMountainBikeSizes = addComplexType("FamilyMountainBikeSizes");
		FamilyMountainBikeSizes.setSimpleContent().setExtension(
				mountainbikesize).addTagAttribute("familyMember",
				XmlType.STRING);
		addComplexType("ChildMountainBikeSizes").setSimpleContent()
				.setRestriction(FamilyMountainBikeSizes).addEnumerationFacet(
						"small", "medium");

	}

	public static void main(String[] a) throws Exception {
		new EmailSchema().validate().print();
	}
}
